package practice;

import java.lang.*;
import java.io.*;


public class Practice {

    static void foo1(int score) {
        /*
        定义一个功能，完成对考试成绩的等级划分。
        90~100 A 优秀
        80~89 B 良好
        70~79 C 中等
        60~69 D 及格
        60以下 E 不及格
         */
        if (score >= 90 && score < 100)
            System.out.println("A");
        else if (score >= 80 && score <= 89)
            System.out.println("B");
        else if (score >= 70 && score <= 79)
            System.out.println("C");
        else if (score >= 60 && score <= 69)
            System.out.println("D");
        else if (score >=0 && score <= 59)
            System.out.println("E");
    }

    static void foo2() {
        // 获取一个数组的最大值
        int [] arr = {22, 23, 34, 56, 76, 23};
        int max = arr[0];
        for (int i = 1; i < arr.length; i++) {
            if (max < arr[i])
                max = arr[i];
        }
        System.out.println(max);
    }

    static void foo3() {
        // 对数组元素进行反转
        Object[] arr = {22, 23.9, 34, 56, 76, 23};
        for (int start = 0, end = arr.length - 1; start < end; start++, end--) {
            Public.swap(arr, start, end);
        }
        Public.showArray(arr);
    }

    static void foo4(int[] arr, int min, int max, int key) {
        // 二分查找
        int mid = (min + max) / 2;
        if (arr[mid] > key)
            foo4(arr, min, mid, key);
        else if (arr[mid] < key)
            foo4(arr, mid, max, key);
        else {
            System.out.print(arr[mid]);
            return;
        }
    }

    static void foo5() {
        // 二维数组求和
        int arr[] []={{22, 33, 12, 32}, {23, 54, 12, 11}, {65, 87, 89, 23}};
        int sum = 0;
        for (int i = 0; i < arr.length; i++)
            for (int j = 0; j < arr[i].length; j++)
                sum += arr[i][j];
        System.out.print(sum);
    }

    static void foo6() {
        // String的一些练习
        String str = "abnbacd";
        String s = str.replace("nba", "haha");
        System.out.println("s=" + s);

        char[] chs = str.toCharArray();//将字符串转成字符数组。
        boolean b = str.contains("Demo");
        System.out.println("b=" + b);

        boolean b1 = str.endsWith(".java");
        System.out.println("b1=" + b1);

        str = "zhangsan,lisi,wangwu";
        String[] names = str.split(",");
        for (int i = 0; i < names.length; i++)
            System.out.print(names[i] + " ");
        System.out.println();

        str = "     ab   c     ";
        str = str.trim();
        System.out.println(str);
    }

    static void foo7() {
        // 获取一个子串在字符串中出现的次数
        String s1 = "nbawernbatyunbaidfnbaghjnba";
        String key = "nba";
        int sum = 0;
        int keyLength = key.length();
        int index;

        while (true) {
            index = s1.indexOf(key);
            if (-1 == index)
                break;
            s1 = s1.substring(index + keyLength);
            sum++;
        }
        System.out.println(sum);
    }

    static void foo8() {
        // 获取两个字符串中最大相同子串
        String s1 = "rtyuicctvnoprtyu";
        String s2 = "cvbcctvnmcctvn1";
        String max, min;
        max = s1.length() > s2.length() ? s1 : s2;
        min = max.equals(s1) ? s2 : s1;
        int maxLength = 0;

        for(int x = 0; x < min.length(); x++){
            for(int y = 0, z = min.length() - x; z != min.length() + 1; y++, z++){
                //获取min子串
                String temp = min.substring(y,z);
                if(max.contains(temp) && temp.length() >= maxLength){
                    maxLength = temp.length();
                    System.out.println(temp);
//                    break;    // 也许有好几个最大的子串
                }
            }
        }
    }

    static void foo9() {
        // 对这个字符串数组进行字典顺序的排序
        String[] strs = {"cba", "abc", "nba", "zz", "qq", "aaa"};
        int min;
        for (int i = 0; i < strs.length - 1; i++) {
            min = i;
            for (int j = i + 1; j < strs.length; j++)
                if (strs[j].compareTo(strs[min]) < 0)
                    min = j;
            String tmp = strs[i];
            strs[i] = strs[min];
            strs[min] = tmp;
        }

        for (int i = 0; i < strs.length; i++)
            System.out.print(strs[i] + " ");
    }

    static void foo10() {
        // 对字符串中的数值进行从小到大的排序
        String str = "34 9 -7 12 67 25";
        String[] strArray = str.split(" ");
        int[] intArray = new int[strArray.length];
        for (int i = 0; i < strArray.length; i++) {
            intArray[i] = Integer.parseInt(strArray[i]);
        }

        // 插入排序
        for (int i = 0; i < intArray.length; i++) {
            int temp = intArray[i];
            while (i > 0 && intArray[i - 1] > temp) {
                intArray[i] = intArray[i - 1];
                i--;
            }
            intArray[i] = temp;
        }

        for (int i = 0; i < intArray.length; i++)
            System.out.print(intArray[i] + " ");
    }

    static void foo11() {
        // 把一个文件夹中的内容拷贝到另一个文件夹中去
    }

    static void foo12() throws IOException {
        // 获取键盘录入，并把录入字符转换成大写输出出来
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String str;
        System.out.println("Enter your value:");
        str = br.readLine();
        System.out.println("You value is: " + str.toUpperCase());
    }

    static void foo13(File dir, int count) {
        // 文件名过滤器

    }

    static void foo14() {
        // 获取指定目录中的所有内容（包含子目录中的内容）

    }

    static void foo15(int year) {
        // 编写程序，判断给定的某个年份是否是闰年。
//       闰年的判断规则如下：
//      （1）若某个年份能被4整除但不能被100整除，则是闰年。
//      （2）若某个年份能被400整除，则也是闰年。
        if (year < 0 || year > 2017) {
            System.out.println("输入的年份有误！");
            return;
        }
        if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0)
            System.out.println(year + "是闰年！");
        else
            System.out.println(year + "不是闰年！");
    }

    static void foo16() {
        // 九九乘法表
        for (int i = 1; i < 10; i++) {
            for (int j = 1; j < i + 1; j++)
                System.out.print(j + "*" + i + "=" + i * j + "     ");
            System.out.println("");
        }
    }

    static void foo17() {
        // 输出所有的水仙花数，把谓水仙花数是指一个数3位数，其各各位数字立方和等于其本身
        // 例如： 153 = 1*1*1 + 3*3*3 + 5*5*5
        int number = 100;   // 从100开始
        int i, j, k;        // 百位、十位、个位
        for (int sum; number < 1000; number++) {
            i = number / 100;
            j = (number - i * 100) / 10;
            k = number - i * 100 - j * 10;
            sum = i * i * i + j * j * j + k * k * k;
            if (sum == number)
                System.out.println(number);
        }
    }

    static void foo18(int v, int count) {
        // 求  a+aa+aaa+.......+aaaaaaaaa=？
        // 其中a为1至9之中的一个数，项数也要可以指定。
        int sum = 0;
        for (int i = 1; i <= count; i++) {
            int temp = 0;
            int mid = 1;
            for (int j = 1; j < i + 1; j++) {
                temp += mid * v;
                mid *= 10;
            }
            sum += temp;
        }
        System.out.println(sum);
    }

    static void foo19() {
        // 求 2/1+3/2+5/3+8/5+13/8.....前20项之和？
        double sum = 0;
        double fenZi = 2.0, fenMu = 1.0;
        for (int i = 0; i < 20; i++) {
            sum += fenZi / fenMu;
            fenMu = fenZi;      // 下一项的分母等于上一项的分子
            fenZi += fenMu;     // 下一项的分子等于上一项的分子加分母
        }
        System.out.println(sum);
    }

    static void foo20() {
        /*
        输出如下图形
           *
           * * *
           * * * * *
           * * * * * * *
           * * * * *
           * * *
           *
         */
        for (int i = 1; i <= 13; i += 2){
            // 1 3 5 7 9 11 13
            for(int j = 1; j <= i && i + j <= 14; j++)
                // 1-1 1-3 1-5 1-7 1-5 1-3 1-1
                System.out.print("* ");
            System.out.println();  // 换行
        }
    }

    static void foo21() {
        // 计算圆周率
        // PI = 4 - 4/3 + 4/5 - 4/7 ...
        // 打印出第一个大于3.1415小于3.1416的值
        double pi = 0;
        double fenZi = 4.0d;
        double fenMu = 1.0d;
        for (int i = 0; i < 100000000; i++) {
            pi += (fenZi / fenMu);
            fenZi *= -1.0;
            fenMu += 2.0;
        }
        System.out.println(pi);
    }

    static void foo22(int n) {
        // 输入一个数据n，计算斐波那契的第n个值
        int start1 = 1, start2 = 1;
        int next;
        for (int i = 0; i < n; i++) {
            System.out.println(start1);
            next = start1 + start2;
            start1 = start2;
            start2 = next;
        }
    }

    static void foo23() {
        // 求1-1/3+1/5-1/7+1/9......的值。
//        a,求出前50项和值。
//        b,求出最后一项绝对值小于1e-5的和值。
        double fenZi = 1;
        double fenMu = 1;
        double sum = 0.0;

        for (int i = 0; i < 50; i++) {
            sum += fenZi / fenMu;
            fenZi *= -1.0;
            fenMu += 2.0;
        }
        System.out.println(sum);

        // 求最后一项绝对值小于1e-5的和值。
        sum = 0.0;
        fenZi = 1;
        fenMu = 1;
        double v;

        while (true) {
            v = fenZi / fenMu;
            if (Math.abs(v) < 1.0e-5) {
                sum += v;
                System.out.println(sum);
                break;
            }
            sum += v;
            fenZi *= -1.0;
            fenMu += 2.0;
        }
    }

    static void foo24(int n) {
        /*
        在屏幕上打印出n行图案，如，若n=5,则图案如下：
                *
              ***
            *****
          *******
        *********
         */
        int max = 2 * n - 1;
        int add = 1;
        for (int i = n; i > 0; i--) {
            for (int j = 0; j < max; j++)
                System.out.print(" ");
            for (int k = 0; k < add; k++)
                System.out.print("*");
            add += 2;
            max -= 2;
            System.out.println();
        }
    }

    static void foo25(int n) {
        // 歌德巴赫猜想，任何一个大于六的偶数可以拆分成两个质数的和
        // 打印出所有的可能
        if (n % 2 != 0 || n < 6)
            return;
    }

    static void foo26() {
        // 定义一个int型的一维数组，包含10个元素，分别赋一些随机整数，然后求出所有元素的
        // 最大值，最小值，平均值，和值，并输出出来。
        int array[] = new int[10];
        for (int i = 0; i < array.length; i++) {
            array[i] = (int) (100 * Math.random());
            System.out.print(array[i] + " ");
        }
        System.out.println();

        int max = array[0];
        int min = array[0];
        int sum = 0;
        for (int i = 1; i < array.length; i++) {
            if (max < array[i])
                max = array[i];
            if (min > array[i])
                min = array[i];
            sum += array[i];
        }
        System.out.println("最大的数字是：" + max);
        System.out.println("最小的数字是：" + min);
        System.out.println("和：" + sum);
    }

    static void foo27(int n) {
        // 打印杨辉三角
        int[] a = new int[n];       // 默认为0
        int previous = 1;
        for (int i = 0; i < n; i++) {
            for (int j = 0; j <= i; j++) {
                // 新的特定位置的元素 = 该位置原来的元素 + 该位置的前一个位置的值
                int current = a[j];
                a[j] = previous + current;
                previous = current;
                System.out.print(a[j] + " ");
            }
            System.out.println();
        }
    }

    static void foo28(int n, int num) {
        /*
        用数组实现约瑟夫出圈问题。 n个人排成一圈，从第一个人开始报数，从1开始报，报到m的人出圈，
        剩下的人继续开始从1报数，直到所有的人都出圈为止。对于给定的n,m，求出所有人的出圈顺序。
         */
        for (int i = 0; i < n; i++) {

        }
    }

    public static void main(String[] args) throws Exception {
//        foo1(59);
//        foo2();
//        foo3();
//        int[] arr = {10, 11, 21, 22, 239, 342, 5226, 33376, 111123};
//        foo4(arr, 0, arr.length, 33376);
//        foo5();
//        foo6();
//        foo7();
//        foo8();
//        foo9();
//        foo10();
//        foo12();
//        for (int i = 1900; i < 2000; i++)
//            foo15(i);
//        foo16();
//        foo17();
//        foo18(2, 5);
//        foo19();
//        foo20();
//        foo21();
//        foo22(5);
//        foo23();
//        foo24(6);
//        foo26();
        foo27(5);
    }
}
